'''
Created on 06/06/2013

@author: cristian
'''
from flask import Flask, session, redirect, url_for, escape, request, Response
from pm import app
from pm.database import db
from pm.models.Archivos import Archivos
from pm.models.Fases import Fases
from pm.models.HistorialDetalle import HistorialDetalle
from pm.models.HistorialItem import HistorialItem
from pm.models.Items import Items
from pm.models.Proyectos import Proyectos
from pm.views import jsonifiedview, ensureParams


@app.route('/archivos/adjuntar', methods=['GET', 'POST']) 
def adjuntarArchivo():
    """
        Crea un nuevo archivo para un item
        @param id_fase: el id de la fase del que se quieren listar los items
        @param id_tipo_item: el tipo del item
        @param complejidad: la complejidad del item
    """
    if request.method == 'POST':
    
        # params = {'GET':request.args, 'POST':request.form}[request.method]
        response = {}
        
        # if not ensureParams(params, ['id_item', 'adjunto']): 
            # response = {"success" : False , "msg" : "Parametros Insuficientes"} 
            # return response
        try:
            id_item = request.form['id_item']
            contenedorArchivos = request.files['adjunto']
            
            item = Items.query.filter(Items.id_item == id_item).one()
            
            '''
             Se comprueba que el proyecto ya no este finalizado
            '''
            fase = Fases.query.filter(Fases.id_fase == item.id_fase).one()
            proyecto = Proyectos.query.filter(Proyectos.id_proyecto == fase.id_proyecto).one()
            
            if proyecto.estado == 3:
                response = {"success" : False , "msg" : "Ups!! El Proyecto ya se Encuentra Finalizado!!"}
                return Response('{success:false}')
            '''
             En esta seccion se  versiona el item 
            '''
            historialItemActual = HistorialItem.query.filter(HistorialItem.id_item == item.id_item).filter(HistorialItem.version == item.version).one()
            
            historialItem = HistorialItem(item.id_item,item.numero, item.nombre, item.estado, item.id_tipo_item, item.id_fase, item.version+1, item.complejidad,item.descripcion, item.observacion, item.prioridad, None,item.costo) 
            db.session.add(historialItem)
            db.session.commit()
            
            
            historialDetalle= HistorialDetalle.query.filter(HistorialDetalle.id_historial_item == historialItemActual.id_historial_item).all()
            for hd in historialDetalle:
                historialDetalleNuevo = HistorialDetalle(hd.id_relacion,historialItem.id_historial_item,hd.estado_relacion)
                db.session.add(historialDetalleNuevo)
                db.session.commit()
                
            
            item_versionar = Items.query.filter(Items.id_item == id_item).update({'version':item.version + 1})
            db.session.commit()
            
            
            
            '''
             En esta seccion se agrega el nuevo archivo
            '''
            try:
                archivo = Archivos(contenedorArchivos.filename,"0",id_item,contenedorArchivos.read(2<<24),True,item.version)
                
                db.session.add(archivo)
                db.session.commit()
            except Exception, e:
                db.session.rollback()
                response = {"success" : False , "msg" : "Ups... Hubo un error al intentar cargar el Adjunto!!"}
                return Response('{success:true}')
            '''
             En esta seccion se agregan los archivos relacionados de la version  anterior y se modifica a la version actual
            '''
            try:
                archivos_version_anterior = Archivos.query.filter(Archivos.id_item == id_item).filter(Archivos.version_item == item.version-1).all()
                if archivos_version_anterior!=None:
                    for archivoAnterior in archivos_version_anterior:
                        archivo_nueva_version = Archivos(archivoAnterior.nombre_archivo,"0",archivoAnterior.id_item,archivoAnterior.archivo,archivoAnterior.activo,archivoAnterior.version_item+1)
                        db.session.add(archivo_nueva_version)
                        db.session.commit()
            except Exception, e:
                db.session.rollback()
                response = {"success" : False , "msg" : "Ups... Hubo un error al intentar versionar archivos anteriores!!"}
                return Response('{success:false}') 
            response = {"success" : True , "msg" : "La Carga se ha realizado exitosamente..!!"}
            return Response('{success:true}') 
        except Exception, e:
            db.session.rollback()
            response = {"success" : False , "msg" : "Ups!! Hubo un error al intentar cargar el archivo"}
            return Response('{success:false}')
        
@app.route('/archivos/listar', methods=['GET', 'POST']) 
@jsonifiedview
def listarArchivos():
    """
        Lista los Archivos del item seleccionado
        @param id_item: identificador del item en cuestion
    """
    
    
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    if not ensureParams(params, ['id_item']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes"} 
        return response
    try:
        id_item = int(params['id_item'])
        
        item= Items.query.filter(Items.id_item==id_item).one()
        
        listaArchivos=[]
        archivos_item = Archivos.query.filter(Archivos.id_item==id_item).filter(Archivos.version_item==item.version).all()
        for ai in archivos_item:
            if ai.activo==True:
                listaArchivos.append(ai)
        response = listaArchivos
        return response
    except Exception, e:
            response = {"success" : False , "msg" : "Ups!! Hubo un error al intentar cargar el archivo"}
            return response
        
@app.route('/archivos/download', methods=['GET', 'POST']) 
def downloadArchivo():
    """
        Descarga el Archivo del item seleccionado
        @param id_archivo: identificador del archivo en cuestion
    """
    
    
    #params = {'GET':request.args, 'POST':request.form}[request.method]
    #response = {}
    
    #if not ensureParams(params, ['id_archivo']): 
        #response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        #return response
    
    id_archivo = int(request.args['id_archivo'])
    
    archivo= Archivos.query.filter(Archivos.id_archivo==id_archivo).one()
    data= archivo.archivo
    respons=Response(content_type='*/*')
    respons.status='200 OK'
    respons.status_code=200
    respons.headers.add('Content-Disposition','attachment; filename='+archivo.nombre_archivo)
    respons.headers.add('Content-Length', str(len(data)))
    respons.data= archivo.archivo
    return respons

   
    
@app.route('/archivos/delete', methods=['GET', 'POST']) 
@jsonifiedview
def deleteArchivo():
    """
        Descarga el Archivo del item seleccionado
        @param id_archivo: identificador del archivo en cuestion
        @param activo: Boolean que representa si la relacion esta activado/desactivado
    """
    
    
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    if not ensureParams(params, ['id_archivo','activo']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    try:
        
        id_archivo = int(params['id_archivo'])
        activo= params['activo']
        
        '''
         Se comprueba que el proyecto ya no este finalizado
        '''
        archivoAux = Archivos.query.filter(Archivos.id_archivo==id_archivo).one()
        item = Items.query.filter(Items.id_item == archivoAux.id_item).one()
        fase = Fases.query.filter(Fases.id_fase == item.id_fase).one()
        proyecto = Proyectos.query.filter(Proyectos.id_proyecto == fase.id_proyecto).one()
        
        if proyecto.estado == 3:
            response = {"success" : False , "msg" : "Ups!! El Proyecto ya se Encuentra Finalizado!!"}
            return Response('{success:false}')
        '''
         En esta seccion se  versiona el item 
        '''
        historialItemActual = HistorialItem.query.filter(HistorialItem.id_item == item.id_item).filter(HistorialItem.version == item.version).one()
        
        historialItem = HistorialItem(item.id_item,item.numero, item.nombre, item.estado, item.id_tipo_item, item.id_fase, item.version+1, item.complejidad,item.descripcion, item.observacion, item.prioridad, None,item.costo) 
        db.session.add(historialItem)
        db.session.commit()
        
        
        historialDetalle= HistorialDetalle.query.filter(HistorialDetalle.id_historial_item == historialItemActual.id_historial_item).all()
        for hd in historialDetalle:
            historialDetalleNuevo = HistorialDetalle(hd.id_relacion,historialItem.id_historial_item,hd.estado_relacion)
            db.session.add(historialDetalleNuevo)
            db.session.commit()
            
        
        item_versionar = Items.query.filter(Items.id_item == item.id_item).update({'version':item.version + 1})
        db.session.commit()
            
        archivo= Archivos.query.filter(Archivos.id_archivo==id_archivo).update({'activo':activo})
        db.session.commit()
        '''
         En esta seccion se agregan los archivos relacionados de la version  anterior y se modifica a la version actual
        '''
        try:
            archivos_version_anterior = Archivos.query.filter(Archivos.id_item == item.id_item).filter(Archivos.version_item == item.version-1).all()
            if archivos_version_anterior!=None:
                for archivoAnterior in archivos_version_anterior:
                    archivo_nueva_version = Archivos(archivoAnterior.nombre_archivo,"0",archivoAnterior.id_item,archivoAnterior.archivo,archivoAnterior.activo,archivoAnterior.version_item+1)
                    db.session.add(archivo_nueva_version)
                    db.session.commit()
        except Exception, e:
            db.session.rollback()
            response = {"success" : False , "msg" : "Ups... Hubo un error al intentar versionar archivos anteriores!!" + str(e)}
            return response
        
        archivo= Archivos.query.filter(Archivos.id_archivo==id_archivo).update({'activo':True})
        db.session.commit()
        response = {"success" : True , "msg" : "Archivo eliminado correctamente"}
        return response
        
    except Exception, e:
            response = {"success" : False , "msg" : "Ups!! Hubo un error al intentar cargar el archivo"}
            return response

@app.route('/archivos/listararchivobyversion', methods=['GET', 'POST']) 
@jsonifiedview
def listarArchivoByVersion():
    """
        Lista los archivos adjuntos en una version determinada
        @param id_item: identificador del item
        @param version: version del item 
    """
    
    
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    if not ensureParams(params, ['id_item','version_item']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    try:
        id_item = int(params['id_item'])
        version_item= params['version_item']
        
        archivos = Archivos.query.filter(Archivos.id_item==id_item).filter(Archivos.version_item==version_item).all()
        listaArchivosVersion=[]
        for a in archivos:
            if a.activo==True:
                listaArchivosVersion.append(a)
        return listaArchivosVersion
        
    except Exception, e:
            response = {"success" : False , "msg" : "Ups!! Hubo un error al intentar listar los archivos en la version!!"}
            return response       

        